Linux shell IO重定向
在命令行中,经常会用到shell命令的重定向操作,下边是常用的一些重定向的小技巧
一些重定向的小技巧
在命令行中,最常用的做法是重定向到一个文件:
$ls > t.txt
把当前目录的文件列表重定向到t.txt文件,这里的>符号的意思就是把ls
命令的标准输出重定向到t.txt文件。
熟悉linux的同学都知道,linux 有三个标准句柄,
0: stdin
1: stdout
2: stderr
所以如果我们想要截获命令行的所有输出标准输出信息的话,就应该采用如下写法:
$ls >t.txt 2>&1
有次,移植python的时候,遇到些问题,需要看看configure的流程,看到了另外一种写法:
exec 5>> config.log
exec 6>> Setup.config
echo "hello"> &5
echo "test config"> &6
这样就可以实现向不同的文件写入详细的过程,而不会污染configure执行过程的输出信息了。 更巧妙的是,如果你是再改造一个已经混乱不堪,输出非常乱的脚本,你可以把标准输出重定向到文件,而自己用一个重定向的句柄来接管标准输出,如下:
echo "first I am in stdout"
exec 3>> t.log
exec 4>&1
exec 5>&2
exec 1>&3
exec 2>&3
echo "seconf I am not in stdout"
echo "third I am in stdout">&4
echo "fourth I am in stderr">&5
题外话: 在调试复杂脚本的时候,很难跟踪流程,可以使用trap命令来很方便的跟踪流程
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
trap捕捉到信号之后,可以有三种反应方式:
- 执行一段程序来处理这一信号
- 接受信号的默认操作
- 忽视这一信号